#pragma once

#include <iostream>
#include <unordered_map>
#include <string>
#include <fstream>
#include "Log.hpp"

using namespace std;

//1.首先将配置文件dict.txt加载到字典类对象中(磁盘中的数据加载到内存当中)
//2.翻译用户给定的字符串并返回结果

const string defaultpath="./dict.txt";
const string sep=": ";
class Dict
{
private:
    bool Load()
    {
        //创建输入文件流对象&&打开文件(文件流对象与磁盘文件建立联系)
        ifstream in(_dict_conf_filepath,ios::in);
        if(!in.is_open()) 
        {
            LOG(FATAL,"open %s error",_dict_conf_filepath.c_str());
            return false;
        }

        //读取文件&&将文件内容插入到容器当中
        string line;
        while(getline(in,line))
        {
            if(line.empty()) continue;//空行直接读取下一行
            //非空行直接进行子串分割,分割为汉语部分与英语部分
            size_t pos=line.find(sep);//pear: 梨 pos指向:的位置
            if(pos==string::npos) continue;//没有查找到分隔符,文件某行非法 eg:pear 梨
            string word=line.substr(0,pos);
            //eg:        : 梨
            if(word.empty()) continue;
            string han=line.substr(pos+sep.size(),string::npos);
            //eg:    pear:
            if(han.empty()) continue;
            
            LOG(DEBUG,"load info, %s: %s",word.c_str(),han.c_str());

            _dict.insert(make_pair(word,han));
        }
        //关闭文件
        in.close();

        LOG(DEBUG,"load %s success",_dict_conf_filepath.c_str());
        return true;
    }
public:
    Dict(const string& path=defaultpath)
    :_dict_conf_filepath(path)
    {
        Load();
    }


    string Translate(const string& word)
    {
        unordered_map<string,string>::iterator pos=_dict.find(word);
        if(pos==_dict.end())
        {
            return "未找到";//case 1:字典中查找不到 case 2:翻译 unknown: 未找到--->采用bool类型区分
        }
        return pos->second;
        //return _dict[word];
    }

    ~Dict()
    {}
private:
    unordered_map<string,string> _dict;// unordered_map查找效率为O(1)
    string _dict_conf_filepath;//字典配置文件路径
};